home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Environments / Clean 1.2.4 / StdEnv / StdFunc.icl < prev    next >
Text File  |  1996-12-23  |  2KB  |  73 lines

  1. implementation module StdFunc
  2.  
  3. // ****************************************************************************************
  4. //    Concurrent Clean Standard Library Module Version 1.1
  5. //    Copyright 1995 University of Nijmegen
  6. // ****************************************************************************************
  7.  
  8. // Some Classical Functions
  9.  
  10. import StdClass, StdMisc, StdInt
  11.  
  12. I::!.a -> .a
  13. I x = x
  14.  
  15. K::!.a .b -> .a
  16. K x y = x
  17.  
  18. S :: !.(a -> .(.b -> .c)) .(a -> .b) a -> .c;
  19. S x y z = x z (y z)
  20.  
  21. flip::!.(.a -> .(.b -> .c)) .b .a -> .c
  22. flip f a b = f b a
  23.  
  24. (o) infixr    9:: u:(.a -> .b) u:(.c -> .a) -> u:(.c -> .b)
  25. (o) f g = composition
  26.     where composition x = f (g x)
  27.     
  28. seq :: ![.(.s -> .s)] .s -> .s
  29. seq [f:fs] arg    =    seq fs (f arg)
  30. seq [] arg        =    arg
  31.  
  32. //    for people who like state manipulation with monads
  33.  
  34. ::St s a :== s -> (a,s)
  35.  
  36. seqList::![St .s .a] .s -> ([.a],.s)
  37. seqList [f:fs] io = ([a:as],iol)
  38. where
  39.     (as,iol) = seqList fs io1 
  40.     (a,io1)  = f io
  41. seqList [] io = ([],io)
  42.  
  43. (`bind`) infix 0 :: w:(St .s .a) v:(.a -> .(St .s .b)) -> u:(St .s .b), [u <= v, u <= w]
  44. (`bind`) f_sta a_fstb = stb
  45. where 
  46.     stb st = a_fstb a nst
  47.     where 
  48.         (a,nst)    =    f_sta st    
  49.  
  50. return::u:a -> u:(St .s u:a)
  51. return x = \s -> (x,s)
  52.  
  53. //    end of monads
  54.  
  55. twice :: !(.a -> .a) .a -> .a
  56. twice f x = f (f x)
  57.  
  58. until::!(a -> .Bool) (a -> a) a -> a
  59. until p f x    | p x     = x
  60.                     = until p f (f x)
  61.  
  62. while :: !(a -> .Bool) (a -> a) a -> a
  63. while p f x    
  64.     | p x    =     while p f (f x)
  65.             =     x
  66.  
  67. iter :: !Int (.a -> .a) .a -> .a
  68. iter 0 f x    =     x
  69. iter n f x
  70.     | n > 0    =     iter (n-1) f (f x)
  71.             =     abort "Error: Negative index given to iter."
  72.  
  73.